/*
    Map
    - API
        1. clear()
        2. delete()
        3. entries()
        4. forEach()
        5. get()
        6. set()
        7. has()
        8. keys()   // 返回iterator对象
        9. values()  // 返回新的 Iterator 对象
*/

let map = new Map([
    ['a', 1], 
    ['b', 2],
]);

let i = map.values();
let j = map.keys();

console.log(i.next().value);  // 1
console.log(j.next().value);  // a



/*
    Object 和 Map 的区别
        - Object的键只能是字符串或者Symbol，Map的键值可以是任意值
        - Map的键值对数量可以通过size属性获取 Object需要通过Object.keys(obj).length类似的方式获取
        - Object有自己的原型，原型链上的键名可能与自己对象的键名产生冲突，除非我们使用Object.create(null)创建一个没有原型的对象
        - Map的键值对是有序的，数据的排序是根据用于push的顺序进行排序，而Object实例中的key value的顺序会按照数字再字母排序
        - Map 通过clear()清空，Object只能重新定义空对象
*/


/*
    Map 和 WeakMap 的区别
        - WeakMap 结构与 Map 结构类似，也是用于生成键值对的集合。
        - 只接受对象作为键名（null 除外），不接受其他类型的值作为键名
        - 键名是弱引用，键值可以是任意的，键名所指向的对象可以被垃圾回收，此时键名是无效的
        - 不能遍历，方法有 get、set、has、delete
*/



let o = new Object();
let m = new Map();

console.log(typeof o); // object
console.log(typeof m); // object 


console.log(o instanceof Object); // true
console.log(m instanceof Map); // true


